R_Merge_Function_VS_Excel_Vlookup_Column_Match
数据分析网
This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.
R中的merge函数类似于Excel中的Vlookup,可以实现对两个数据表进行匹配和拼接的功能。与Excel不同之处在于merge函数有4种匹配拼接模式,分别为inner,left,right和outer模式。
其中inner为默认的匹配模式。本篇文章我们将介绍merge函数的使用方法和4种拼接模式的区别。
1. Introduction to merge function
merge
函数的使用方法很简单,以下是官方的函数功能介绍和使用说明。
2. Description
Merge two data frames by common columns or row names, or do other versions of database join operations.
Usage
merge(x, y, ...)
merge(x, y, ...)
merge(x, y, by = intersect(names(x), names(y)),
by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all,
sort = TRUE, suffixes = c(".x",".y"),
incomparables = NULL, ...)
In SQL database terminology, the default value of all = FALSE
gives a natural join, a special case of an inner join.
Specifying all.x = TRUE
gives a left (outer) join, all.y = TRUE
a right (outer) join, and both
(all = TRUE a (full) outer join. DBMSes do not match NULL records, equivalent to incomparables = NA in R.
merge
函数中第一个出现的数据表是拼接后的left部分,第二个出现的数据表是拼接后的right部分。merge默认会按照两个数据表中共有的字段名称进行匹配和拼接。
3. 读取并创建数据表
开始使用merge函数进行数据拼接之前先读取需要进行匹配的两个数据表,并命名为loan_status表和member_info表。
loan_status=data.frame(read.csv('loan_status.csv',header = 1))
member_info=data.frame(read.csv('member_info.csv',header = 1))
4. 查看数据表
下面我们分别查看了两个数据表中的内容。这个示例中的两个数据表较小,可以完整显示出来,如果数据量较大的话可以就不能这么直观的查看了。
number_id <- c(1277178, 12345)
load_amount <- c(10000,1909)
term <- c("36 months", "20 monthes")
foo <- Sys.getlocale()
Sys.setlocale(locale="C")
Sys.setlocale("LC_COLLATE", "C")
Sys.setlocale("LC_ALL", locale = foo)
issue_d <- as.Date(c("02/27/92", "01/14/92"),"%m/%d/%y")
loan_status <- c("Fully Paid", "Current")
total_pymnt_inv <- c(12231.89, 3581.89)
total_rec_int <- c(2214.92,1600)
loan_status <- data.frame(number_id,
load_amount,
term,
issue_d,
loan_status,
total_pymnt_inv)
loan_status
member_id <- c(1277178, 12345)
grade <- c("B", "C")
emp_length <- c("10 + years", "5 years")
annual_inc <- c(24000, 30000)
member_info <- data.frame(member_id,
grade,
emp_length,
annual_inc)
dim(loan_status);dim(member_info)
loan_status
member_info
names(loan_status);names(member_info)
5. inner匹配
inner模式是merge的默认匹配模式,我们通过下面的文氏图来说明inner的匹配方法。Inner模式提供在loan_status和member_info表中共有字段的匹配结果。也就是对两个的表交集部分进行匹配和拼接。单独只出现在一个表中的字段值不会参与匹配和拼接。从下面的匹配结果中也可以看出,共有22行,包含了loan_status和member_info的交集。
merge(loan_status,member_info,by = 'member_id')
6. outer匹配
outer模式是两个表的汇总,将loan_status和member_info两个要匹配的两个表汇总在一起,生成一张汇总的唯一值数据表以及匹配结果。从结果中可以看出共包含30行数据,比两个表的行数都要多。并且在grade和其他字段包含Na值,这些是在两个表中匹配不到的内容。
merge(loan_status,member_info,all=TRUE,sort=TRUE)
7. left匹配
left模式是左匹配,以左边的数据表loan_status为基础匹配右边的数据表member_info中的内容。匹配不到的内容以NaN值显示。在Excel中就好像将Vlookup公式写在了左边的表中。下面的文氏图说明了left模式的匹配方法。Left模式匹配的结果显示了所有左边数据表的内容,以及和右边数据表共有的内容。
以下为使用left模式匹配并拼接后的结果,loan_status在merge函数中第一个出现,因此为左表,member_grade第二个出现,为右表。匹配模式为all.x=TRUE。从结果中可以看出left匹配模式保留了一张完整的loan_status表,以此为基础对member_info表中的内容进行匹配。loan_status表中有5个member_id值在member_info中无法找到,因此grade字段显示为NA值。
merge(loan_status,member_info,all.x=TRUE,sort=TRUE)
8. right匹配
right与left模式正好相反,right模式是右匹配,以右边的数据表member_info为基础匹配左边的数据表loan_status。匹配不到的内容以NA值显示。下面通过文氏图说明right模式的匹配方法。Right模式匹配的结果显示了所有右边数据表的内容,以及和左边数据表共有的内容。
以下为使用right模式匹配拼接的结果,从结果表中可以看出right匹配模式保留了完整的member_info表,以此为基础对loan_status表进行匹配,在loan_status数据表中有3个条目在member_info数据表中无法找到,因此显示为了NA值。
merge(loan_status,member_info,all.y=TRUE,sort=TRUE)
LS0tDQp0aXRsZTogIlJfTWVyZ2VfRnVuY3Rpb25fVlNfRXhjZWxfVmxvb2t1cF9Db2x1bW5fTWF0Y2giDQpvdXRwdXQ6IA0KICBodG1sX25vdGVib29rOiANCiAgICB0b2M6IHllcw0KLS0tDQoNCiMgUl9NZXJnZV9GdW5jdGlvbl9WU19FeGNlbF9WbG9va3VwX0NvbHVtbl9NYXRjaA0KDQo+IFvmlbDmja7liIbmnpDnvZFdKGh0dHA6Ly93d3cuYWZlbnhpLmNvbS9wb3N0LzQxNDMyKQ0KDQpUaGlzIGlzIGFuIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgbm90ZWJvb2ssIHRoZSByZXN1bHRzIGFwcGVhciBiZW5lYXRoIHRoZSBjb2RlLiANCg0KUuS4reeahG1lcmdl5Ye95pWw57G75Ly85LqORXhjZWzkuK3nmoRWbG9va3Vw77yM5Y+v5Lul5a6e546w5a+55Lik5Liq5pWw5o2u6KGo6L+b6KGM5Yy56YWN5ZKM5ou85o6l55qE5Yqf6IO944CC5LiORXhjZWzkuI3lkIzkuYvlpITlnKjkuo5tZXJnZeWHveaVsOaciTTnp43ljLnphY3mi7zmjqXmqKHlvI/vvIzliIbliKvkuLppbm5lcu+8jGxlZnTvvIxyaWdodOWSjG91dGVy5qih5byP44CCDQoNCuWFtuS4rWlubmVy5Li66buY6K6k55qE5Yy56YWN5qih5byP44CC5pys56+H5paH56ug5oiR5Lus5bCG5LuL57uNbWVyZ2Xlh73mlbDnmoTkvb/nlKjmlrnms5Xlkow056eN5ou85o6l5qih5byP55qE5Yy65Yir44CCDQoNCiMjIDEuIEludHJvZHVjdGlvbiB0byBtZXJnZSBmdW5jdGlvbg0KDQpgbWVyZ2Vg5Ye95pWw55qE5L2/55So5pa55rOV5b6I566A5Y2V77yM5Lul5LiL5piv5a6Y5pa555qE5Ye95pWw5Yqf6IO95LuL57uN5ZKM5L2/55So6K+05piO44CCDQoNCmBgYHtyfQ0KI+afpeeci21lcmdl5biu5Yqp5L+h5oGvDQo/bWVyZ2UNCg0KYGBgDQoNCiMjIDIuIERlc2NyaXB0aW9uDQoNCk1lcmdlIHR3byBkYXRhIGZyYW1lcyBieSBjb21tb24gY29sdW1ucyBvciByb3cgbmFtZXMsIG9yIGRvIG90aGVyIHZlcnNpb25zIG9mIGRhdGFiYXNlIGpvaW4gb3BlcmF0aW9ucy4NCg0KVXNhZ2UNCmBgYHtyfQ0KbWVyZ2UoeCwgeSwgLi4uKQ0KDQojIyBEZWZhdWx0IFMzIG1ldGhvZDoNCm1lcmdlKHgsIHksIC4uLikNCg0KIyMgUzMgbWV0aG9kIGZvciBjbGFzcyAnZGF0YS5mcmFtZScNCm1lcmdlKHgsIHksIGJ5ID0gaW50ZXJzZWN0KG5hbWVzKHgpLCBuYW1lcyh5KSksDQogICAgICBieS54ID0gYnksIGJ5LnkgPSBieSwgYWxsID0gRkFMU0UsIGFsbC54ID0gYWxsLCBhbGwueSA9IGFsbCwNCiAgICAgIHNvcnQgPSBUUlVFLCBzdWZmaXhlcyA9IGMoIi54IiwiLnkiKSwNCiAgICAgIGluY29tcGFyYWJsZXMgPSBOVUxMLCAuLi4pDQpgYGANCg0KSW4gU1FMIGRhdGFiYXNlIHRlcm1pbm9sb2d5LCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBgYWxsID0gRkFMU0VgIGdpdmVzIGEgbmF0dXJhbCBqb2luLCBhIHNwZWNpYWwgY2FzZSBvZiBhbiBpbm5lciBqb2luLiANCg0KU3BlY2lmeWluZyBgYWxsLnggPSBUUlVFYCBnaXZlcyBhIGxlZnQgKG91dGVyKSBqb2luLCBgYWxsLnkgPSBUUlVFYCBhIHJpZ2h0IChvdXRlcikgam9pbiwgYW5kIGBib3RoYCAoYWxsID0gVFJVRSBhIChmdWxsKSBvdXRlciBqb2luLiBEQk1TZXMgZG8gbm90IG1hdGNoIE5VTEwgcmVjb3JkcywgZXF1aXZhbGVudCB0byBpbmNvbXBhcmFibGVzID0gTkEgaW4gUi4NCg0KYG1lcmdlYOWHveaVsOS4reesrOS4gOS4quWHuueOsOeahOaVsOaNruihqOaYr+aLvOaOpeWQjueahGxlZnTpg6jliIbvvIznrKzkuozkuKrlh7rnjrDnmoTmlbDmja7ooajmmK/mi7zmjqXlkI7nmoRyaWdodOmDqOWIhuOAgm1lcmdl6buY6K6k5Lya5oyJ54Wn5Lik5Liq5pWw5o2u6KGo5Lit5YWx5pyJ55qE5a2X5q615ZCN56ew6L+b6KGM5Yy56YWN5ZKM5ou85o6l44CCDQoNCiMjIDMuIOivu+WPluW5tuWIm+W7uuaVsOaNruihqA0KDQrlvIDlp4vkvb/nlKhtZXJnZeWHveaVsOi/m+ihjOaVsOaNruaLvOaOpeS5i+WJjeWFiOivu+WPlumcgOimgei/m+ihjOWMuemFjeeahOS4pOS4quaVsOaNruihqO+8jOW5tuWRveWQjeS4umxvYW5fc3RhdHVz6KGo5ZKMbWVtYmVyX2luZm/ooajjgIINCmBgYHtyfQ0KI+ivu+WPluW5tuWIm+W7uui0t+asvueKtuaAgeaVsOaNruihqA0KbG9hbl9zdGF0dXM9ZGF0YS5mcmFtZShyZWFkLmNzdignbG9hbl9zdGF0dXMuY3N2JyxoZWFkZXIgPSAxKSkNCiPor7vlj5blubbliJvlu7rnlKjmiLfkv6Hmga/mlbDmja7ooagNCm1lbWJlcl9pbmZvPWRhdGEuZnJhbWUocmVhZC5jc3YoJ21lbWJlcl9pbmZvLmNzdicsaGVhZGVyID0gMSkpDQpgYGANCg0KIyMgNC4g5p+l55yL5pWw5o2u6KGoDQoNCuS4i+mdouaIkeS7rOWIhuWIq+afpeeci+S6huS4pOS4quaVsOaNruihqOS4reeahOWGheWuueOAgui/meS4quekuuS+i+S4reeahOS4pOS4quaVsOaNruihqOi+g+Wwj++8jOWPr+S7peWujOaVtOaYvuekuuWHuuadpe+8jOWmguaenOaVsOaNrumHj+i+g+Wkp+eahOivneWPr+S7peWwseS4jeiDvei/meS5iOebtOingueahOafpeeci+S6huOAgg0KYGBge3J9DQoj5p+l55yL6LS35qy+54q25oCB5pWw5o2u6KGoDQojIGxvYW5fc3RhdHVzDQpudW1iZXJfaWQgPC0gYygxMjc3MTc4LCAxMjM0NSkNCmxvYWRfYW1vdW50IDwtIGMoMTAwMDAsMTkwOSkNCnRlcm0gPC0gYygiMzYgbW9udGhzIiwgIjIwIG1vbnRoZXMiKQ0KDQojIEdldCBkZXRhaWxzIG9mIG9yIHNldCBhc3BlY3RzIG9mIHRoZSBsb2NhbGUgZm9yIHRoZSBSIHByb2Nlc3MuDQpmb28gPC0gU3lzLmdldGxvY2FsZSgpDQpTeXMuc2V0bG9jYWxlKGxvY2FsZT0iQyIpDQpTeXMuc2V0bG9jYWxlKCJMQ19DT0xMQVRFIiwgIkMiKQ0KIyBiYWNrdXANClN5cy5zZXRsb2NhbGUoIkxDX0FMTCIsIGxvY2FsZSA9IGZvbykNCg0KaXNzdWVfZCA8LSBhcy5EYXRlKGMoIjAyLzI3LzkyIiwgIjAxLzE0LzkyIiksIiVtLyVkLyV5IikNCmxvYW5fc3RhdHVzIDwtIGMoIkZ1bGx5IFBhaWQiLCAiQ3VycmVudCIpDQp0b3RhbF9weW1udF9pbnYgPC0gYygxMjIzMS44OSwgMzU4MS44OSkNCnRvdGFsX3JlY19pbnQgPC0gYygyMjE0LjkyLDE2MDApDQoNCmxvYW5fc3RhdHVzIDwtIGRhdGEuZnJhbWUobnVtYmVyX2lkLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZF9hbW91bnQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNzdWVfZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGxvYW5fc3RhdHVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbF9weW1udF9pbnYpDQpsb2FuX3N0YXR1cw0KDQoNCiPmn6XnnIvnlKjmiLfkv6Hmga/mlbDmja7ooagNCiMgbWVtYmVyX2luZm8NCm1lbWJlcl9pZCA8LSBjKDEyNzcxNzgsIDEyMzQ1KQ0KZ3JhZGUgPC0gYygiQiIsICJDIikNCmVtcF9sZW5ndGggPC0gYygiMTAgKyB5ZWFycyIsICI1IHllYXJzIikNCmFubnVhbF9pbmMgPC0gYygyNDAwMCwgMzAwMDApDQptZW1iZXJfaW5mbyA8LSBkYXRhLmZyYW1lKG1lbWJlcl9pZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wX2xlbmd0aCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGFubnVhbF9pbmMpDQoNCiPmn6XnnIvkuKTkuKrmlbDmja7ooajnmoTnu7TluqYNCiMg5a+55LqO6L6D5aSn55qE5pWw5o2u6KGo77yM5Y+v5Lul5L2/55SoZGlt5Ye95pWw5p+l55yL5pWw5o2u6KGo55qE57u05bqm77yM5LiL6Z2i5oiR5Lus5YiG5Yir5p+l55yL5LqG6LS35qy+54q25oCB6KGo5ZKM55So5oi35L+h5oGv6KGo55qE57u05bqm44CC6LS35qy+54q25oCB6KGo5pyJMjfooYw35YiX77yM55So5oi35L+h5oGv6KGo5pyJMjXooYw05YiX44CCDQpkaW0obG9hbl9zdGF0dXMpO2RpbShtZW1iZXJfaW5mbykNCg0KI+afpeeci+i0t+asvueKtuaAgeaVsOaNruihqA0KbG9hbl9zdGF0dXMNCg0KI+afpeeci+eUqOaIt+S/oeaBr+aVsOaNruihqA0KbWVtYmVyX2luZm8NCg0KIyDkvb/nlKhuYW1lc+WHveaVsOafpeeci+S4pOS4quaVsOaNruihqOeahOWIl+WQjeensO+8jOS4i+mdouWIhuWIq+aYvuekuuS6huS7o+eggeWSjOWIl+WQjeensOOAguWPr+S7peWPkeeOsO+8jOS4pOS4quaVsOaNruihqOS4reacieS4gOS4quWFseWQjOeahOWIl21lbWJlcl9pZOOAgg0KI+afpeeci+S4pOS4quaVsOaNruihqOeahOWIl+WQjeensA0KbmFtZXMobG9hbl9zdGF0dXMpO25hbWVzKG1lbWJlcl9pbmZvKQ0KDQojIFsxXSAibWVtYmVyX2lkIiAibG9hbl9hbW50IiAidGVybSIiaXNzdWVfZCIgImxvYW5fc3RhdHVzIiAidG90YWxfcHltbnRfaW52IiAidG90YWxfcmVjX2ludCINCiMgWzFdICJtZW1iZXJfaWQiICJncmFkZSIgImVtcF9sZW5ndGgiICJhbm51YWxfaW5jIg0KDQoNCmBgYA0KDQojIyA1LiBpbm5lcuWMuemFjQ0KDQppbm5lcuaooeW8j+aYr21lcmdl55qE6buY6K6k5Yy56YWN5qih5byP77yM5oiR5Lus6YCa6L+H5LiL6Z2i55qE5paH5rCP5Zu+5p2l6K+05piOaW5uZXLnmoTljLnphY3mlrnms5XjgIJJbm5lcuaooeW8j+aPkOS+m+WcqGxvYW5fc3RhdHVz5ZKMbWVtYmVyX2luZm/ooajkuK3lhbHmnInlrZfmrrXnmoTljLnphY3nu5PmnpzjgILkuZ/lsLHmmK/lr7nkuKTkuKrnmoTooajkuqTpm4bpg6jliIbov5vooYzljLnphY3lkozmi7zmjqXjgILljZXni6zlj6rlh7rnjrDlnKjkuIDkuKrooajkuK3nmoTlrZfmrrXlgLzkuI3kvJrlj4LkuI7ljLnphY3lkozmi7zmjqXjgILku47kuIvpnaLnmoTljLnphY3nu5PmnpzkuK3kuZ/lj6/ku6XnnIvlh7rvvIzlhbHmnIkyMuihjO+8jOWMheWQq+S6hmxvYW5fc3RhdHVz5ZKMbWVtYmVyX2luZm/nmoTkuqTpm4bjgIINCg0KYGBge3J9DQojaW5uZXLmqKHlvI/ljLnphY0NCm1lcmdlKGxvYW5fc3RhdHVzLG1lbWJlcl9pbmZvLGJ5ID0gJ21lbWJlcl9pZCcpDQpgYGANCg0KIyMgNi4gb3V0ZXLljLnphY0NCg0Kb3V0ZXLmqKHlvI/mmK/kuKTkuKrooajnmoTmsYfmgLvvvIzlsIZsb2FuX3N0YXR1c+WSjG1lbWJlcl9pbmZv5Lik5Liq6KaB5Yy56YWN55qE5Lik5Liq6KGo5rGH5oC75Zyo5LiA6LW377yM55Sf5oiQ5LiA5byg5rGH5oC755qE5ZSv5LiA5YC85pWw5o2u6KGo5Lul5Y+K5Yy56YWN57uT5p6c44CC5LuO57uT5p6c5Lit5Y+v5Lul55yL5Ye65YWx5YyF5ZCrMzDooYzmlbDmja7vvIzmr5TkuKTkuKrooajnmoTooYzmlbDpg73opoHlpJrjgILlubbkuJTlnKhncmFkZeWSjOWFtuS7luWtl+auteWMheWQq05h5YC877yM6L+Z5Lqb5piv5Zyo5Lik5Liq6KGo5Lit5Yy56YWN5LiN5Yiw55qE5YaF5a6544CCDQoNCmBgYHtyfQ0KI291dGVy5qih5byP5Yy56YWNDQptZXJnZShsb2FuX3N0YXR1cyxtZW1iZXJfaW5mbyxhbGw9VFJVRSxzb3J0PVRSVUUpDQpgYGANCg0KIyMgNy4gbGVmdOWMuemFjQ0KDQpsZWZ05qih5byP5piv5bem5Yy56YWN77yM5Lul5bem6L6555qE5pWw5o2u6KGobG9hbl9zdGF0dXPkuLrln7rnoYDljLnphY3lj7PovrnnmoTmlbDmja7ooahtZW1iZXJfaW5mb+S4reeahOWGheWuueOAguWMuemFjeS4jeWIsOeahOWGheWuueS7pU5hTuWAvOaYvuekuuOAguWcqEV4Y2Vs5Lit5bCx5aW95YOP5bCGVmxvb2t1cOWFrOW8j+WGmeWcqOS6huW3pui+ueeahOihqOS4reOAguS4i+mdoueahOaWh+awj+WbvuivtOaYjuS6hmxlZnTmqKHlvI/nmoTljLnphY3mlrnms5XjgIJMZWZ05qih5byP5Yy56YWN55qE57uT5p6c5pi+56S65LqG5omA5pyJ5bem6L655pWw5o2u6KGo55qE5YaF5a6577yM5Lul5Y+K5ZKM5Y+z6L655pWw5o2u6KGo5YWx5pyJ55qE5YaF5a6544CCDQoNCuS7peS4i+S4uuS9v+eUqGxlZnTmqKHlvI/ljLnphY3lubbmi7zmjqXlkI7nmoTnu5PmnpzvvIxsb2FuX3N0YXR1c+WcqG1lcmdl5Ye95pWw5Lit56ys5LiA5Liq5Ye6546w77yM5Zug5q2k5Li65bem6KGo77yMbWVtYmVyX2dyYWRl56ys5LqM5Liq5Ye6546w77yM5Li65Y+z6KGo44CC5Yy56YWN5qih5byP5Li6YWxsLng9VFJVReOAguS7jue7k+aenOS4reWPr+S7peeci+WHumxlZnTljLnphY3mqKHlvI/kv53nlZnkuobkuIDlvKDlrozmlbTnmoRsb2FuX3N0YXR1c+ihqO+8jOS7peatpOS4uuWfuuehgOWvuW1lbWJlcl9pbmZv6KGo5Lit55qE5YaF5a656L+b6KGM5Yy56YWN44CCbG9hbl9zdGF0dXPooajkuK3mnIk15LiqbWVtYmVyX2lk5YC85ZyobWVtYmVyX2luZm/kuK3ml6Dms5Xmib7liLDvvIzlm6DmraRncmFkZeWtl+auteaYvuekuuS4uk5B5YC844CCDQoNCmBgYHtyfQ0KI2xlZnTmqKHlvI/ljLnphY0NCm1lcmdlKGxvYW5fc3RhdHVzLG1lbWJlcl9pbmZvLGFsbC54PVRSVUUsc29ydD1UUlVFKQ0KYGBgDQoNCiMjIDguIHJpZ2h05Yy56YWNDQoNCnJpZ2h05LiObGVmdOaooeW8j+ato+WlveebuOWPje+8jHJpZ2h05qih5byP5piv5Y+z5Yy56YWN77yM5Lul5Y+z6L6555qE5pWw5o2u6KGobWVtYmVyX2luZm/kuLrln7rnoYDljLnphY3lt6bovrnnmoTmlbDmja7ooahsb2FuX3N0YXR1c+OAguWMuemFjeS4jeWIsOeahOWGheWuueS7pU5B5YC85pi+56S644CC5LiL6Z2i6YCa6L+H5paH5rCP5Zu+6K+05piOcmlnaHTmqKHlvI/nmoTljLnphY3mlrnms5XjgIJSaWdodOaooeW8j+WMuemFjeeahOe7k+aenOaYvuekuuS6huaJgOacieWPs+i+ueaVsOaNruihqOeahOWGheWuue+8jOS7peWPiuWSjOW3pui+ueaVsOaNruihqOWFseacieeahOWGheWuueOAgg0KDQrku6XkuIvkuLrkvb/nlKhyaWdodOaooeW8j+WMuemFjeaLvOaOpeeahOe7k+aenO+8jOS7jue7k+aenOihqOS4reWPr+S7peeci+WHunJpZ2h05Yy56YWN5qih5byP5L+d55WZ5LqG5a6M5pW055qEbWVtYmVyX2luZm/ooajvvIzku6XmraTkuLrln7rnoYDlr7lsb2FuX3N0YXR1c+ihqOi/m+ihjOWMuemFje+8jOWcqGxvYW5fc3RhdHVz5pWw5o2u6KGo5Lit5pyJM+S4quadoeebruWcqG1lbWJlcl9pbmZv5pWw5o2u6KGo5Lit5peg5rOV5om+5Yiw77yM5Zug5q2k5pi+56S65Li65LqGTkHlgLzjgIINCmBgYHtyfQ0KI3JpZ2h05qih5byP5Yy56YWNDQptZXJnZShsb2FuX3N0YXR1cyxtZW1iZXJfaW5mbyxhbGwueT1UUlVFLHNvcnQ9VFJVRSkNCmBgYA0KDQoNCg0KDQo=